import { Entity } from "../../core/Entity";
import { Skill } from "../shell/Skill";

// export enum SkillInstanceState {
//     Init,           // 初始化
//     Casting,        // 施法中
//     Channeling,     // 引导中
//     Executing,      // 执行中
//     Finished,       // 已完成
//     Interrupted     // 已打断
// }

export class SkillInstance {
    private _skill: Skill;
    private _caster: Entity;
    private _targets: Entity[];  // 这个是只只技能瞄准的目标，最终是否能打到不一定，或者最终打到的是不是这些，也不一定
    private _isFinished: boolean = false;
    private _isInterrupted: boolean = false;

    // 事件，技能打到的时候应该然skillinstance来触发


    // main-entity - 一个entity对应一个json文件，也可以从表格配置中生成entity，entity支持回收

    // 提供一个参数表用于技能组件之间的通信
    private _params = new Map<string, any>();

    setParam(key: string, value: any): void {
        this._params.set(key, value);
    }

    getParam(key: string): any {
        return this._params.get(key);
    }

    private _simulationSpeed = 10000; // 10000 = 100%
    private _simulationTime = 0;

    get simulationSpeed(): number {
        return this._simulationSpeed;
    }

    set simulationSpeed(value: number) {
        this._simulationSpeed = value;
    }

    get simulationTime(): number {
        return this._simulationTime;
    }

    set simulationTime(value: number) {
        this._simulationTime = value;
    }
    
    // 技能状态
    // private state: SkillInstanceState = SkillInstanceState.Init;    
    constructor(skill: Skill, caster: Entity, targets: Entity[]) {
        this._skill = skill;
        this._caster = caster;
        this._targets = targets;
    }
    
    // 更新技能实例
    public update(dt: number): void {
        if (this._isFinished || this._isInterrupted) return;
    }
    
    // 打断技能
    public interrupt(): void {
        if (this.isFinished) return;
        
        this.isInterrupted = true;
        this.state = SkillState.Interrupted;
        
        // 触发打断效果
        this.timeline.interrupt();
        
        // 清理资源
        this.cleanup();
    }
    
    // 完成技能
    private finish(): void {
        this.isFinished = true;
        this.state = SkillState.Finished;
        
        // 清理资源
        this.cleanup();
    }
    
    // 清理资源
    private cleanup(): void {
        // 清理所有效果
        this.effects.forEach(effect => effect.cleanup());
        this.effects = [];
    }
    
    // 获取技能状态
    public getState(): SkillState {
        return this.state;
    }
    
    // 获取技能信息
    public getInfo(): SkillInstanceInfo {
        return {
            id: this.id,
            skillId: this.skill.getId(),
            caster: this.caster,
            targets: this.targets,
            startTime: this.startTime,
            state: this.state
        };
    }
}

/**
 * 释放一个技能的流程
 */
let si = new SkillInstance();
si.addEntity(new Entity());
si.update(dt);

// 行为mask

// 行为掩码定义
export enum BehaviorMask {
    None = 0,           // 无限制
    CanMove = 1 << 0,   // 可以移动
    CanCastSkill = 1 << 1,  // 可以释放技能
    CanAttack = 1 << 2,     // 可以攻击
    CanBeAttacked = 1 << 3, // 可以被攻击
    CanUseItem = 1 << 4,    // 可以使用道具
    CanInteract = 1 << 5,   // 可以与物体交互
    CanJump = 1 << 6,       // 可以跳跃
    CanSprint = 1 << 7,     // 可以冲刺
    CanDodge = 1 << 8,      // 可以闪避
    CanBlock = 1 << 9,      // 可以格挡
    CanRevive = 1 << 10,    // 可以复活
    CanBeRevived = 1 << 11, // 可以被复活
    CanTrade = 1 << 12,     // 可以交易
    CanChat = 1 << 13,      // 可以聊天
    CanJoinParty = 1 << 14, // 可以加入队伍
    CanJoinGuild = 1 << 15, // 可以加入公会
    All = 0xFFFFFFFF        // 所有行为都允许
}
// 设置角色行为mask（是否可以移动，是否可以释放技能）
// 
// //）




